package cn.wolfcode.web.service.impl;

import cn.wolfcode.web.annotation.RequiredPermission;
import cn.wolfcode.web.domain.Employee;
import cn.wolfcode.web.mapper.EmployeeMapper;
import cn.wolfcode.web.mapper.LoginMapper;
import cn.wolfcode.web.service.ILoginService;
import cn.wolfcode.web.service.IPermissionService;
import cn.wolfcode.web.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;
import java.util.List;

@Service
public class LoginServiceImpl implements ILoginService {
    @Autowired
    private EmployeeMapper employeeMapper;
    @Autowired
    private HttpSession session;
    @Autowired
    private IPermissionService permissionService;

    @Override
    public Employee selectUsernameAndPassword(String username, String password) {
//如果密码和账号跟数据库的不一样,就查询不到装了密码和账号的对象.
// 所以只要判断对象是不是空,抛异常给控制器,控制器再根据异常返回jsonResult结果提示用户.
        Employee employee = employeeMapper.selectUsernameAndPassword(username, password);
        方式一:
//        session.setAttribute("employee", employee);
        //            方式二:抽取到工具类,使用工具类,把要登录的员工对象放在session作用域对象里面.
        UserContext.setCurrentUser(employee);
//        问题:如果用户经常点一些资源,就需要经常查询数据库他拥有的权限表达式,这样数据库压力增加了.
// 所以把它放在session作用域对象里面.以后他点击访问了,请求就自动在拦截器里面进行判断有没有权限.有权限才可以访问,
// 就不用每次都查询数据库了
        if (!employee.getAdmin()) {//如果不是管理员,就查询他的权限表达式,并且放在session作用域对象里面.
//            方式一:
            List<String> permissions = permissionService.selectByEmpId(employee.getId());
//            session.setAttribute("PERMISSIONS_IN_SESSION", permissions);
//            方式二:抽取到工具类,使用工具类,把该员工的所有权限放在session作用域对象里面.
            UserContext.setPermissions(permissions);
        }

//        如果判断对象是不是空,就是没有登录过,就抛异常给控制器,控制器再根据异常返回jsonResult结果提示用户.
        if (employee == null) {
            throw new RuntimeException("亲,您的账号或者密码错误");
        }

        return employee;
    }
}
